9643. Числа
Каталана
Числа
Каталана cn задаются
рекуррентным соотношением:
с0 = 1,
сn = , n > 0
Вычислите n-ое число Каталана по модулю m.
Вход. Два целых числа n (0 ≤ n ≤ 104) и m (0 < m ≤ 109).
Выход. Выведите значение cn mod m.
Пример
входа |
Пример
выхода |
5
100 |
42 |
числа
Каталана
Рекуррентное соотношение
перепишем в виде:
с0 = 1,
сn = c0cn-1
+ c1cn-2 + c2cn-3
+ ... + cn-1c0, при n
> 0
Например,
·
с0 = 1
·
с1 = c0c0 = 1,
·
с2 = c0c1 + c1c0
= 1 + 1 = 2,
·
с3 = c0c2 + c1c1
+ c2c0 = 2 + 1 + 2 = 5,
·
с4 = c0c3 + c1c2
+ c2c1 + c3c0
= 5 + 2 + 2 + 5 = 14,
·
с5 = c0c4 + c1c3
+ c2c2 + c3c1
+ c4c0 = 14 + 5 + 4 + 5 + 14 = 42
Поскольку
значение сn пересчитывается через все предыдущие значения c0,
c1, c2, ..., cn-1,
то значения чисел Каталана будем запоминать в линейном массиве.
Реализация алгоритма
Объявим
массив cat, в котором будем запоминать
числа Каталана: cat[i] = ci.
long long cat[10001];
Читаем
входные данные.
scanf("%lld %lld",
&n, &m);
Вычисляем
числа Каталана по рекуррентной формуле.
cat[0] = 1;
for (i = 1; i <= n; i++)
{
for (j = 0; j < i; j++)
cat[i] =
(cat[i] + cat[j] * cat[i - j - 1]) % m;
}
Выводим
n-ое число Каталана.
printf("%lld\n", cat[n]);
Python реализация
Читаем
входные данные.
n, m = map(int, input().split())
В
списке cat будем запоминать числа Каталана: cat[i]
= ci.
cat = [0] * (n + 1)
Вычисляем
числа Каталана по рекуррентной формуле.
cat[0] = 1
for i in range(1, n + 1):
for j in range(i):
cat[i] = (cat[i] + cat[j] * cat[i - j - 1]) % m
Выводим
n-ое число Каталана.
print(cat[n])